﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Entidades;
using Negocio;
using Mundialeitor.App_Util;

namespace Mundialeitor
{
    public partial class Partidos : PaginaBase
    {
        private UsuarioEntity usuario;
        public UsuarioEntity Usuario
        {
            get { return usuario; }
            set { usuario = value; }
        }

        public PartidoEntity Partido
        {
            get { return (PartidoEntity)Session["partido"]; }
            set { Session["partido"] = value; }
        }
        
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                Usuario = (UsuarioEntity)Session["usuario"];

                if (Usuario != null && Usuario.TipoUsuario.Id == (int)EnumTipoUsuario.Administrador)
                {
                    if (!IsPostBack)
                    {
                        Utilidades.CargarComboDesdeEnumeracion(ddlSedeConsulta, typeof(Entidades.EnumSedes), "Todas");
                        Utilidades.CargarCombo(ddlLocalBusqueda, new SeleccionRules().SeleccionarTodos(), "Nombre", "Id", "Todas");
                        Utilidades.CargarCombo(ddlVisitanteBusqueda, new SeleccionRules().SeleccionarTodos(), "Nombre", "Id", "Todas");
                        Utilidades.CargarCombo(ddlEtapaConsulta, new EtapaRules().SeleccionarTodas(), "Nombre", "Id", "Todas");
                        Utilidades.CargarComboDesdeEnumeracion(ddlSede, typeof(Entidades.EnumSedes), "Seleccione");
                        Utilidades.CargarCombo(ddlSeleccionUno, new SeleccionRules().SeleccionarTodos(), "Nombre", "Id", "Seleccione");
                        Utilidades.CargarCombo(ddlSeleccionDos, new SeleccionRules().SeleccionarTodos(), "Nombre", "Id", "Seleccione");
                        Utilidades.CargarCombo(ddlEtapa, new EtapaRules().SeleccionarTodas(), "Nombre", "Id", "Seleccione");
                    }
                }
                else
                {
                    Server.Transfer(PagesConstants.Login);
                }
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        protected void calFechaDesde_SelectionChanged(object sender, EventArgs e)
        {
            txtFechaDesde.Text = calFechaDesde.SelectedDate.ToString();
        }

        protected void calFechaHasta_SelectionChanged(object sender, EventArgs e)
        {
            txtFechaHasta.Text = calFechaHasta.SelectedDate.ToString();
        }

        protected void btnConsultar_Click(object sender, EventArgs e)
        {
            try
            {
                DateTime? fechaDesde = string.IsNullOrEmpty(txtFechaDesde.Text.Trim()) ? (DateTime?)null : DateTime.Parse(txtFechaDesde.Text.Trim());
                DateTime? fechaHasta = string.IsNullOrEmpty(txtFechaHasta.Text.Trim()) ? (DateTime?)null : DateTime.Parse(txtFechaHasta.Text.Trim());
                int? idLocal = String.IsNullOrEmpty(ddlLocalBusqueda.SelectedValue) ? (int?)null : int.Parse(ddlLocalBusqueda.SelectedValue);
                int? idVisitante = String.IsNullOrEmpty(ddlVisitanteBusqueda.SelectedValue) ? (int?)null : int.Parse(ddlVisitanteBusqueda.SelectedValue);
                int? idEtapa = null;
                bool? sinEtapa =null;
                if (!chkSinEtapa.Checked)
                {
                    idEtapa = String.IsNullOrEmpty(ddlEtapaConsulta.SelectedValue) ? (int?)null : int.Parse(ddlEtapaConsulta.SelectedValue);
                    sinEtapa = !idEtapa.HasValue ? true : (bool?)null; 
                }
                else
                    sinEtapa = true;
                var regla = new PartidoRules();
                var lista = regla.SeleccionarPartidoPorFiltro(string.IsNullOrEmpty(ddlSedeConsulta.SelectedValue) ? null : ddlSedeConsulta.SelectedValue, fechaDesde, fechaHasta, idLocal, idVisitante, idEtapa, sinEtapa);

                CargarGrilla(lista);
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        private void CargarGrilla(List<PartidoEntity> lista)
        {
            Session["partidosGrilla"] = lista;
            Utilidades.CargarGrilla(gvPartidos, lista);
        }

        protected void gvPartidos_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            try
            {
                gvPartidos.PageIndex = e.NewPageIndex;
                gvPartidos.DataSource = (List<PartidoEntity>)Session["partidosGrilla"];
                gvPartidos.DataBind();
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        protected void gvPartidos_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                if (!(e.CommandName == "Ver" || e.CommandName == "Eliminar"))
                {
                    return;
                }

                gvPartidos.SelectedIndex = Convert.ToInt32(e.CommandArgument);
                int id = int.Parse(gvPartidos.SelectedDataKey["Id"].ToString());

                PartidoEntity etapaSeleccionada = ObtenerPartido(id);

                // Definir el estado del control de usuario
                switch (e.CommandName)
                {
                    case "Ver":
                        CargarDatosPartido(etapaSeleccionada, true);
                        break;
                    case "Eliminar":
                        CargarDatosPartido(etapaSeleccionada, false);
                        break;
                }

                ModoConsulta(false);
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        private void ModoConsulta(bool valor)
        {
            divConsulta.Visible = valor;
            divABM.Visible = !valor;
        }

        protected void gvPartidos_RowCreated(object sender, GridViewRowEventArgs e)
        {
            try
            {
                // Asociación de CommandArgument de cada fila con el id de la entidad
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    var partidoGrilla=(List<PartidoEntity>)Session["partidosGrilla"];
                    Image img;
                    img = (Image)e.Row.FindControl("imgBanderaLocal");
                    img.ImageUrl = "~/App_Themes/Banderas/" + partidoGrilla[e.Row.RowIndex].Local.Abreviatura + ".gif";
                    img = (Image)e.Row.FindControl("imgBanderaVisitante");
                    img.ImageUrl = "~/App_Themes/Banderas/" + partidoGrilla[e.Row.RowIndex].Visitante.Abreviatura + ".gif";
                    ImageButton btn;
                    //Boton Ver
                    btn = (ImageButton)e.Row.FindControl("btnVer");
                    btn.CommandArgument = e.Row.RowIndex.ToString();
                    //Boton Eliminar
                    btn = (ImageButton)e.Row.FindControl("btnEliminar");
                    btn.CommandArgument = e.Row.RowIndex.ToString();
                }
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        protected void btnAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                if (Page.IsValid)
                {
                    bool alta = Partido.Id == 0;
                    var selecciones = new SeleccionRules();
                    Partido.Sede = ddlSede.SelectedValue;
                    Partido.Fecha = DateTime.Parse(txtFecha.Text.Trim());
                    Partido.Local = selecciones.SeleccionarPorId(int.Parse(ddlSeleccionUno.SelectedValue));
                    Partido.GolLocal = string.IsNullOrEmpty(txtGolSeleccionUno.Text) ? (int?)null : int.Parse(txtGolSeleccionUno.Text);
                    Partido.Visitante = selecciones.SeleccionarPorId(int.Parse(ddlSeleccionDos.SelectedValue));
                    Partido.GolVisitante = string.IsNullOrEmpty(txtGolSeleccionDos.Text) ? (int?)null : int.Parse(txtGolSeleccionDos.Text);
                    Partido.ResultadoEnGrilla = Partido.GolLocal.HasValue && Partido.GolVisitante.HasValue ? Partido.GolLocal.ToString() + "-" + Partido.GolVisitante.ToString() : "--";
                    var regla = new PartidoRules();
                    regla.GuardarPartido(Partido);
                    MostrarMensajeDialogo(EnumTipoDeMensaje.Informacion, alta ? "Partido creado exitosamente" : "Partido modificado exitosamente");
                    var listado = (List<PartidoEntity>)Session["partidosGrilla"];
                    if (listado != null)
                    {
                        for (int i = 0; i > listado.Count; i++)
                            if (listado[i].Id == Partido.Id)
                            {
                                listado[i] = Partido;
                                break;
                            }
                    }
                    else
                    {
                        listado = new List<PartidoEntity>();
                        listado.Add(Partido);
                    }
                    CargarGrilla(listado);
                    ModoConsulta(true);
                }
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                LimpiarControles();
                HabilitarControles(true);
                ModoConsulta(true);
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        private void LimpiarControles()
        {
            ddlEtapa.SelectedIndex = 0;
            ddlSede.SelectedIndex = 0;            
            txtFecha.Text = string.Empty;
            calFecha.SelectedDate = DateTime.Today;
            ddlSeleccionUno.SelectedIndex = 0;
            txtGolSeleccionUno.Text = string.Empty;
            ddlSeleccionDos.SelectedIndex = 0;
            txtGolSeleccionDos.Text = string.Empty;
        }

        private void CargarDatosPartido(PartidoEntity objPartido, bool valor)
        {
            var etapa = new EtapaRules();
            if (etapa.ExistenEtapasCargadas())
                ddlEtapa.SelectedIndex = objPartido.EtapaId.HasValue ? objPartido.EtapaId.Value : 0;
            ddlSede.SelectedValue = objPartido.Sede;
            txtFecha.Text = objPartido.Fecha.ToLongDateString();
            calFecha.SelectedDate = objPartido.Fecha.Date;
            ddlSeleccionUno.SelectedIndex = objPartido.Local.Id;
            txtGolSeleccionUno.Text = objPartido.GolLocal.HasValue ? objPartido.GolLocal.Value.ToString() : "";
            ddlSeleccionDos.SelectedIndex = objPartido.Visitante.Id;
            txtGolSeleccionDos.Text = objPartido.GolVisitante.HasValue ? objPartido.GolVisitante.Value.ToString() : "";

            HabilitarControles(valor);
            Partido = objPartido;
        }

        private void HabilitarControles(bool valor)
        {
            //txtGolSeleccionUno.Enabled = valor;
            //y los demas controles
        }

        private PartidoEntity ObtenerPartido(int id)
        {
            List<PartidoEntity> lista = (List<PartidoEntity>)Session["partidosGrilla"];
            var obj = (from e in lista where e.Id == id select e).FirstOrDefault();
            return obj;
        }        

        protected void btnNuevo_Click(object sender, EventArgs e)
        {
            try
            {
                Partido = new PartidoEntity();
                Partido.Id = 0;
                ModoConsulta(false);
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        protected void calFecha_SelectionChanged(object sender, EventArgs e)
        {
            txtFecha.Text = calFecha.SelectedDate.ToString();
        }

        protected void valGoles_ServerValidate(object source, ServerValidateEventArgs args)
        {
            if (!string.IsNullOrEmpty(txtGolSeleccionUno.Text) && string.IsNullOrEmpty(txtGolSeleccionDos.Text) ||
                string.IsNullOrEmpty(txtGolSeleccionUno.Text) && !string.IsNullOrEmpty(txtGolSeleccionDos.Text))
                args.IsValid = false;
        }

        protected void chkSinEtapa_CheckedChanged(object sender, EventArgs e)
        {
            ddlEtapaConsulta.Enabled = !chkSinEtapa.Checked;
        }
        
    }
}
